package com.sunnada.edu.system.pub.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

public class Office2PDF {

	/**
	 * 
	 * 注意：要保证服务先启动，亲测：以下程序在linux中执行会有问题，故要分两个步骤执行，第一：调用shell，启动openoffice服务，第二：
	 * 调用方法，将office文档转为pdf 代码都有，切分开来即可
	 * 
	 * @param sourceFile
	 * @param destFile
	 * @return
	 * @throws InterruptedException
	 */
	public static int office2PDF(String sourceFile, String destFile)
			throws InterruptedException {

		try {
			File inputFile = new File(sourceFile);
			if (!inputFile.exists()) {
				return -1;// 找不到源文件, 则返回-1
			}
			// 如果目标路径不存在, 则新建该路径
			File outputFile = new File(destFile);
			if (!outputFile.getParentFile().exists()) {
				outputFile.getParentFile().mkdirs();
			}
			// 启动OpenOffice的服务
			Process pro = null;
			if (System.getProperty("os.name").indexOf("Windows") > -1) {
				String command = "C:/Program Files (x86)/OpenOffice 4/program/soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\"";
				pro = Runtime.getRuntime().exec(command);
			} else {
				String[] cmds = {
						"/bin/sh",
						"-c",
						"/opt/openoffice4/program/soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard &" };
				pro = Runtime.getRuntime().exec(cmds);
			}

			pro.waitFor();
			OpenOfficeConnection connection = new SocketOpenOfficeConnection(
					"127.0.0.1", 8100);
			connection.connect();
			DocumentConverter converter = new OpenOfficeDocumentConverter(
					connection);
			converter.convert(inputFile, outputFile);
			connection.disconnect();
			// 关闭OpenOffice服务的进程
			pro.destroy();
			System.out
					.println("----------------------success--------------------------------");
			return 0;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return 1;

	}
    /**
     * String filePath 为模板路径（pages/business/contracTemplate/pages/business/contracTemplate/index.html"）
     * String dest   为pdf生成位置（"d:\\test.pdf"）
     * String tempPath  为生成html文件的临时路径 （"pages/business/contracTemplate/"）
     *  String content  为模板的内容
     *    
     * */
	public static String officetoPDF(String filePath, String dest,String tempPath, String content,HttpServletRequest request){
		String filePath1 = request.getSession().getServletContext().getRealPath("/") ;
		 try {
			   //模板路径
			   // filePath = "./pages/system/ueditor/index.html";
			   //下面这个方法来获取文件流我还没弄明白
			   //InputStream is= Temp.class.getClassLoader().getResourceAsStream("whtml");
			   String templateContent = "";
			   FileInputStream fileinputstream = new FileInputStream(filePath1+filePath);// 读取模板文件
			   //下面四行：获得输入流的长度，然后建一个该长度的数组，然后把输入流中的数据以字节的形式读入到数组中，然后关闭流
			   int lenght = fileinputstream.available();
			   byte bytes[] = new byte[lenght];
			   fileinputstream.read(bytes);
			   fileinputstream.close();
			   //通过使用平台的默认字符集解码指定的 byte 数组，构造一个新的 String。然后利用字符串的replaceAll()方法进行指定字符的替换
			   //此处除了这种方法之外，应该还可以使用表达式语言${}的方法来进行。
			   templateContent = new String(bytes);
			   //System.out.print(templateContent);
			   templateContent = templateContent.replaceAll("###content###", content);
			  //使用平台的默认字符集将此 String 编码为 byte 序列，并将结果存储到一个新的 byte 数组中。
			   byte tag_bytes[] = templateContent.getBytes();
			  // System.out.print(templateContent);
			   // 根据时间得文件名。Calendar 的 getInstance 方法返回一个 Calendar 对象，其日历字段已由当前日期和时间初始化
			   Calendar calendar = Calendar.getInstance();
			   //valueOf()方法进行类型的转换，转换成String型
			   String fileame = String.valueOf(calendar.getTimeInMillis())+ ".html";
			   //fileame = "./pages/system/ueditor/" + fileame;// 生成的html文件保存路径。
			   fileame = filePath1+tempPath + fileame;
			   FileOutputStream fileoutputstream = new FileOutputStream(fileame);// 建立文件输出流
			   fileoutputstream.write(tag_bytes);
			   fileoutputstream.close();
			    String source = fileame;
			   // dest = "d:\\test.pdf";
				int result = office2PDF(source, dest);
				
				/*source = source.toString();
			    java.io.File myDelFile = new java.io.File(source);
			    myDelFile.delete();*/
				System.out.println(result);
			  } catch (Exception e) {
			   System.out.print(e.toString());
			  }
		return "";
	}
	
	
	
	
	public static void main(String[] args) throws InterruptedException {
		 try {
			   String title = "测试java 生成 Html";
			   String content = "字段内容";
			   String editer = "作者";
			   //模板路径
			   String filePath = "./pages/system/ueditor/index.html";
			   //下面这个方法来获取文件流我还没弄明白
			   //InputStream is= Temp.class.getClassLoader().getResourceAsStream("whtml");
			   String templateContent = "";
			   FileInputStream fileinputstream = new FileInputStream(filePath);// 读取模板文件
			   //下面四行：获得输入流的长度，然后建一个该长度的数组，然后把输入流中的数据以字节的形式读入到数组中，然后关闭流
			   int lenght = fileinputstream.available();
			   byte bytes[] = new byte[lenght];
			   fileinputstream.read(bytes);
			   fileinputstream.close();
			   //通过使用平台的默认字符集解码指定的 byte 数组，构造一个新的 String。然后利用字符串的replaceAll()方法进行指定字符的替换
			   //此处除了这种方法之外，应该还可以使用表达式语言${}的方法来进行。
			   templateContent = new String(bytes);
			   //System.out.print(templateContent);
			   templateContent = templateContent.replaceAll("###content###", content);
			  //使用平台的默认字符集将此 String 编码为 byte 序列，并将结果存储到一个新的 byte 数组中。
			   byte tag_bytes[] = templateContent.getBytes();
			  // System.out.print(templateContent);
			   // 根据时间得文件名。Calendar 的 getInstance 方法返回一个 Calendar 对象，其日历字段已由当前日期和时间初始化
			   Calendar calendar = Calendar.getInstance();
			   //valueOf()方法进行类型的转换，转换成String型
			   String fileame = String.valueOf(calendar.getTimeInMillis())+ ".html";
			   fileame = "./pages/system/ueditor/" + fileame;// 生成的html文件保存路径。
			   FileOutputStream fileoutputstream = new FileOutputStream(fileame);// 建立文件输出流
			   fileoutputstream.write(tag_bytes);
			   fileoutputstream.close();
			    String source = fileame;
				String dest = "d:\\test.pdf";
				int result = office2PDF(source, dest);
				System.out.println(result);
			  } catch (Exception e) {
			   System.out.print(e.toString());
			  }
		

	}

}
